package uy.org.softtech.cssuite.entidad;

import static javax.xml.bind.annotation.XmlAccessType.FIELD;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.MappedSuperclass;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Version;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlTransient;

import org.codehaus.jackson.annotate.JsonIgnore;

/**
 * Clase abstracta que contiene la definición de los campos comunes a todas las entidades.
 *
 * @author fabian.lobo
 */
@MappedSuperclass
@XmlAccessorType(FIELD)
@XmlTransient
public abstract class Entidad {
	
	public static final Integer ZERO = Integer.valueOf(0);
	public static final Integer CANTIDAD_REGISTROS = Integer.valueOf(500);
	
	public static final String CLIENTE_PREFIJO = "cliente";
	public static final String CLIENTE_NAMESPACE = "http://cssuite.softtech.org.uy/esquemas/cliente";
	
	public static final String FINANZAS_PREFIJO = "finanzas";
	public static final String FINANZAS_NAMESPACE = "http://cssuite.softtech.org.uy/esquemas/finanzas";
	
	public static final String SISTEMAS_PREFIJO = "sistema";
	public static final String SISTEMAS_NAMESPACE = "http://cssuite.softtech.org.uy/esquemas/sistema";
	
	public static final String USUARIO_PREFIJO = "usuario";
	public static final String USUARIO_NAMESPACE = "http://cssuite.softtech.org.uy/esquemas/usuario";
	
	@Column(name = "VERSION", nullable = false)
	@JsonIgnore
	@Version
	@XmlTransient
	private Integer version;
	
	@Column(name = "CREADO_POR", length = 200, nullable = false)
	@JsonIgnore
	@XmlTransient
	private String creadoPor;
	
	@Column(name = "CREADO_EN", length = 200, nullable = false)
	@JsonIgnore
	@XmlTransient
	private String creadoEn;
	
	@Column(name = "CREADO", nullable = false)
	@JsonIgnore
	@Temporal(TemporalType.TIMESTAMP)
	@XmlTransient
	private Date creado;
	
	@Column(name = "ACTUALIZADO_POR", length = 200, nullable = true)
	@JsonIgnore
	@XmlTransient
	private String actualizadoPor;
	
	@Column(name = "ACTUALIZADO_EN", length = 200, nullable = true)
	@JsonIgnore
	@XmlTransient
	private String actualizadoEn;
	
	@Column(name = "ACTUALIZADO", nullable = true)
	@JsonIgnore
	@Temporal(TemporalType.TIMESTAMP)
	@XmlTransient
	private Date actualizado;

	/*
	 *  GETTERS
	 */
	public Integer getVersion() {
		return version;
	}
	public String getCreadoPor() {
		return creadoPor;
	}
	public String getCreadoEn() {
		return creadoEn;
	}
	public Date getCreado() {
		return creado;
	}
	public String getActualizadoPor() {
		return actualizadoPor;
	}
	public String getActualizadoEn() {
		return actualizadoEn;
	}
	public Date getActualizado() {
		return actualizado;
	}
	
	/*
	 *  SETTERS
	 */
	public void setVersion(Integer version) {
		this.version = version;
	}
	public void setCreadoPor(String creadoPor) {
		this.creadoPor = creadoPor;
	}
	public void setCreadoEn(String creadoEn) {
		this.creadoEn = creadoEn;
	}
	public void setCreado(Date creado) {
		this.creado = creado;
	}
	public void setActualizadoPor(String actualizadoPor) {
		this.actualizadoPor = actualizadoPor;
	}
	public void setActualizadoEn(String actualizadoEn) {
		this.actualizadoEn = actualizadoEn;
	}
	public void setActualizado(Date actualizado) {
		this.actualizado = actualizado;
	}
	
	/*
	 * 	METODOS
	 */

	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	public abstract int hashCode();
	
	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	public abstract boolean equals(Object obj);
	
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	public abstract String toString();
	
	/**
	 * Retorna una representación en texto del objecto. Si 'incluirColecciones' es 'true', el resultado contendrá una representación en texto
	 * de cada uno de los items de las colecciones relacionadas. En caso contrario, sólo contendrá los valores de los campos del objecto.
	 * 
	 * @param incluirColecciones - Flag para indicar si se incluyen las colecciones en el resultado.
	 * @return Una representación en texto de todo el grafo del objecto.
	 * 
	 * @author fabian.lobo
	 */
	public abstract String toString(boolean incluirColecciones);
}
